home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / scope / 151-175 / scopedisk158 / dmouse / dmouse.c < prev    next >
C/C++ Source or Header  |  1995-03-19  |  7KB  |  270 lines

  1.  
  2. /*
  3.  *  DMOUSE.C    V1.24  11 October 1990
  4.  *
  5.  *  (c)Copyright 1989 by Matthew Dillon, All Rights Reserved
  6.  *
  7.  *  DMOUSE QUIT
  8.  *  DMOUSE -a# -t# -s# -m# -c# -p# -w# -Ln -lqqqq -Rqqqq -An -Kcccc -Qqqqq -C cmd
  9.  *       -d#
  10.  *
  11.  *  -a#     # = acceleration, default 3.    1 to disable
  12.  *  -t#     # = mouse threshold before acceleration takes effect, def. 0
  13.  *        (in pixels/event)
  14.  *  -s#     # = screen timeout, default 5min,    0 to disable
  15.  *  -m#     # = pointer timeout, default 5 secs,0 to disable
  16.  *  -c#     # = # of clicks to bring window to front
  17.  *  -p#     # = input device priority
  18.  *  -w#     1 = Use WindowToFront()/WindowToBack()  else    (workbench users)
  19.  *        0 = Use UpFrontLayer(), etc...                  (cli users)
  20.  *        NOTE: defaults to -w0 now, will be -w1 for 1.4
  21.  *  -f#     1 = Enable WindowToFront()/Back() (default)
  22.  *        0 = Disable WindowToFront()/Back() if window does not have
  23.  *        front and back gadgets
  24.  *  -L0     Disable LeftMouseButton->WindowToFront (LMB+RMB->ToBack)
  25.  *  -L1     Enable it
  26.  *  -lqqqq  Set qualifier + LMB for Window to front (default none)
  27.  *  -Rqqqq  Set qualifier + RMB for Window/ScreenToBack (default LMB)
  28.  *  -A0     Disable Auto-Activate window on mouse move
  29.  *  -A1     Enable it, keyhit-auto-activate disabled    (bit 0 = mouse aa)
  30.  *  -A3     Enable it, keyhit-auto-activate enabled    (bit 1 = key aa)
  31.  *  -Kcccc  Set key code in hex that activates cmd, def is escape
  32.  *  -Qqqqq  Set key qualifier in hex for keycode, def is left-amiga
  33.  *  -C cmd  Set command (must be last option on command line), def NewCli
  34.  *
  35.  *  -d#     Debug mode    (if compiled in)
  36.  */
  37.  
  38. #include "dmouse.h"
  39. #include <exec/libraries.h>
  40.  
  41. #define VERSION 24
  42.  
  43. #include <stdio.h>
  44. #include <stdlib.h>
  45. #include <string.h>
  46.  
  47. long    ahtoi(char *);
  48.  
  49. extern    struct Library *SysBase;
  50.  
  51. main(ac, av)
  52. int ac;
  53. char *av[];
  54. {
  55.     short i, j, len;
  56.     long val;
  57.     char *ptr;
  58.     DMS  *dms = (DMS *)FindPort(PORTNAME);
  59.     short   exists;
  60.     short   create;
  61.     short   quit = 0;
  62.  
  63.     exists = (dms) ? 1 : 0;
  64.     create = (dms) ? 0 : 1;
  65.  
  66.     if (create) {
  67.     dms = AllocMem(sizeof(DMS), MEMF_PUBLIC|MEMF_CLEAR);
  68.     dms->IPri = 51;
  69.     dms->Version = VERSION;
  70.     dms->Acc = 3;
  71.     dms->STo = 5*60;
  72.     dms->MTo = 5;
  73.     dms->Code = 0x45;
  74.     dms->Qual = 0x8040;
  75.     dms->RQual= 0x4000;
  76.     dms->Clicks = 1;
  77.     dms->CLeft = dms->Clicks;
  78.     dms->FBEnable = 1;
  79.     strcpy(dms->Cmd, "newcli");
  80.     dms->LMBEnable = 1;
  81.     dms->AAEnable = 3;
  82.     dms->NoSprData = AllocMem(12, MEMF_PUBLIC|MEMF_CHIP|MEMF_CLEAR);
  83.     dms->NoSprData[0] = 0xFE00;
  84.     dms->NoSprData[1] = 0xFF00;
  85.  
  86.     /*
  87.      *  2.0 defaults
  88.      */
  89.  
  90.     if (SysBase->lib_Version >= 36)
  91.         dms->Workbench = 1;
  92.     }
  93.  
  94.     for (i = 1; i < ac; ++i) {
  95.     ptr = av[i];
  96.     if (strcmp(ptr, "QUIT") == 0 || strcmp(ptr, "quit") == 0) {
  97.         quit = 1;
  98.         create = 0;
  99.         break;
  100.     }
  101.     val = atoi(ptr+2);
  102.     if (*ptr != '-')
  103.         goto def;
  104.  
  105.     switch(ptr[1]) {
  106.     case 'd':
  107.         dms->Debug = val;
  108.         break;
  109.     case 'a':
  110.         dms->Acc = val;
  111.         break;
  112.     case 'c':
  113.         if (val < 1)
  114.         val = 1;
  115.         dms->Clicks = dms->CLeft = val;
  116.         break;
  117.     case 'w':
  118.         dms->Workbench = val;
  119.         break;
  120.     case 'f':
  121.         dms->FBEnable = val;
  122.         break;
  123.     case 'p':
  124.         dms->IPri = val;
  125.         break;
  126.     case 't':
  127.         dms->AThresh = val;
  128.         break;
  129.     case 's':
  130.         dms->STo = val;
  131.         break;
  132.     case 'm':
  133.         dms->MTo = val;
  134.         break;
  135.     case 'L':
  136.         dms->LMBEnable = val;
  137.         break;
  138.     case 'l':
  139.         dms->LQual = ahtoi(ptr+2);
  140.         break;
  141.     case 'R':
  142.         dms->RQual = ahtoi(ptr+2);
  143.         break;
  144.     case 'A':
  145.         dms->AAEnable = val;
  146.         break;
  147.     case 'K':
  148.         dms->Code = ahtoi(ptr+2);
  149.         break;
  150.     case 'Q':
  151.         dms->Qual = ahtoi(ptr+2) | 0x8000;
  152.         break;
  153.     case 'S':
  154.     case 'M':
  155.         puts("-S and -M options obsolete");
  156.         break;
  157.     case 'C':
  158.         for (len = strlen(ptr+2) + 2, j = i + 1; j < ac; ++j)
  159.         len += strlen(av[j]) + 1;
  160.         strcpy(dms->Cmd, ptr + 2);
  161.         for (j = i + 1; j < ac; ++j) {
  162.         if (dms->Cmd[0])
  163.             strcat(dms->Cmd, " ");
  164.         strcat(dms->Cmd, av[j]);
  165.         }
  166.         i = ac;
  167.         break;
  168.     default:    def:
  169.         puts("DMOUSE QUIT  or");
  170.         puts("DMOUSE -a# -t# -s# -m# -Ln -Rqqqq -An -Kcccc -Qqqqq -C cmd");
  171.         printf("DMouse (c)Copyright 1989-90, Matthew Dillon, All Rights Reserved\nV1.%02d, " __DATE__ "\n\n", VERSION);
  172.         puts("Freeware, redistributable for non-profit only");
  173.         puts("  -a#     Acceleration (default 3)");
  174.         puts("  -t#     Accel. threshold (default 0)");
  175.         puts("  -s#     Screen timeout (default 300)");
  176.         puts("  -m#     Mouse timeout (default 5)");
  177.         puts("  -c#     Set # of clicks for wintofront (default 1)");
  178.         puts("  -p#     # = input device priority");
  179.         puts("  -w#     0 = use UpFrontLayer().. 1 = use WindowToFront()");
  180.         puts("  -L0/1   LMB disable/enable (default 1=enabled)");
  181.         puts("  -lqqqq  LMB qualifier wintofront (default 0=none)");
  182.         puts("  -Rqqqq  RMB qualifier wintoback (default 4000=LMB)");
  183.         puts("  -A0-3   Auto-Activate Window disable/enable. B0=mouse B1=keyboard");
  184.         puts("  -Kcccc  Command Key Code, default 45 = esc");
  185.         puts("  -Qqqqq  Command Key Qualifier, default 40 = Left Amiga");
  186.         puts("  -C cmd  cmd to run, must be last option");
  187.         puts("Note: LMB(or -R qualifier)(hold)+RMB = WindowToBack");
  188.         puts("\n");
  189.         puts("Additionaly, Most options may be modified while DMOUSE is active");
  190.         create = 0;
  191.         i = ac;
  192.         break;
  193.     }
  194.     }
  195.     dms->Reset = 1;
  196.     if (!exists && create) {
  197.     PROC *proc;
  198.     printf("Installing DMouse, ");
  199.     fflush(stdout);
  200.     dms->Port.mp_Flags = PA_IGNORE;
  201.     dms->Port.mp_Node.ln_Pri = 0;
  202.     dms->Port.mp_Node.ln_Type= NT_MSGPORT;
  203.     dms->Port.mp_Node.ln_Name= AllocMem(sizeof(PORTNAME), MEMF_PUBLIC);
  204.     strcpy(dms->Port.mp_Node.ln_Name, PORTNAME);
  205.     NewList(&dms->Port.mp_MsgList);
  206.     dms->Segment = (long)LoadSeg("l:DMouse-Handler");
  207.     if (!dms->Segment)
  208.         dms->Segment = (long)LoadSeg("DMouse-Handler");
  209.     if (!dms->Segment) {
  210.         puts("Unable to find L:DMouse-Handler");
  211.         FreeMem(dms->Port.mp_Node.ln_Name, sizeof(PORTNAME));
  212.         create = 0;
  213.     } else {
  214.         AddPort(&dms->Port);
  215.         dms->ShakeTask = FindTask(NULL);
  216.         dms->ShakeSig = AllocSignal(-1);
  217.         proc = (PROC *)CreateProc(dms->Port.mp_Node.ln_Name, 1, dms->Segment, 4096);
  218.         Wait(1 << dms->ShakeSig);
  219.         FreeSignal(dms->ShakeSig);
  220.         exists = 1;
  221.         quit = dms->StartupError;
  222.         if (quit)
  223.         puts("Handler error");
  224.         else
  225.         printf("ok.  DMouse V1.%02d, by Matthew Dillon.\n(c)Copyright 1989-90, Matthew Dillon, All Rights Reserved\n", VERSION);
  226.     }
  227.     }
  228.     if (quit) {
  229.     if (exists) {
  230.         printf("Removing, ");
  231.         fflush(stdout);
  232.         dms->ShakeTask = FindTask(NULL);
  233.         dms->ShakeSig = AllocSignal(-1);
  234.         Signal(dms->HandTask, SBF_C);
  235.         Wait(1 << dms->ShakeSig);
  236.         FreeSignal(dms->ShakeSig);
  237.         RemPort(&dms->Port);
  238.         FreeMem(dms->Port.mp_Node.ln_Name, sizeof(PORTNAME));
  239.         UnLoadSeg(dms->Segment);
  240.         puts("ok");
  241.     }
  242.     exists = 0;
  243.     create = 0;
  244.     }
  245.     if (!exists) {
  246.     FreeMem(dms->NoSprData, 12);
  247.     FreeMem(dms, sizeof(DMS));
  248.     }
  249.     return(0);
  250. }
  251.  
  252. long
  253. ahtoi(str)
  254. char *str;
  255. {
  256.     long val = 0;
  257.     char c;
  258.     while (c = *str) {
  259.     val <<= 4;
  260.     if (c >= '0' && c <= '9')
  261.         val |= (c & 15);
  262.     else
  263.         val |= (c & 15) + 9;
  264.     ++str;
  265.     }
  266.     return(val);
  267. }
  268.  
  269.  
  270.